# -*- coding: utf-8 -*-
# @Time    : 2021/10/28 22:40
# @Author  : XIEHAO
# @Email   : xiehao_1989@126.com
# File     : serializers.py
# @Software: PyCharm

"""
序列化器
    本质是一个类，和模型类差不多的类
    用于json格式与模型对象互相转换以及校验数据

    定义的属性就是要参与的字段

    序列化字段可以少于或多于模型类字段（属性），但是字段名需要保持一直
"""
from rest_framework import serializers
from rest_framework.relations import StringRelatedField

from .models import Student, Classes


# class StudentSerialezer(serializers.Serializer):
#     SEX_CHOICES = {
#         (0, '女'),
#         (1, '男')
#     }
#     id = serializers.IntegerField(label='ID', read_only=True)
#     name = serializers.CharField(max_length=30, label='姓名')
#     age = serializers.IntegerField(label='年龄', required=False)
#     sex = serializers.IntegerField(label='性别', required=False, choices=SEX_CHOICES)
#     create_time = serializers.DateTimeField(label='创建时间', auto_now_add=True, required=False)
#     update_time = serializers.DateTimeField(label='更新时间', auto_now=True, required=False)
#     is_delete = serializers.BooleanField(default=False, label='逻辑删除', required=False)


class StudentSerializer(serializers.ModelSerializer):
    # classes = StringRelatedField(read_only=True)  # 将模型classes的返回值做展示

    # 需先定义元信息，指定具体的模型类
    class Meta:
        model = Student  # 指定序列化器映射的模型类
        fields = '__all__'  # feilds指定映射字段 __all__表示所有字段
        # fields = ['id', 'name', 'age']  # 只映射这三个字段
        # exclude = ['id']  #映射除id以外的所有字段

        # 修改字段的过滤信息
        extra_kwargs = {
            'age': {'min_value': 0, 'max_value': 200}
        }

        # 追加额外的校验逻辑，该方法适合单个数据校验
        # def validate_name(self, value):
        #     if 'python' not in value.lower():
        #         raise serializers.ValidationError('name error')
        #     return value

        # 对象级别的额外验证，该方法适合多个数据校验
        def validate(self, data):
            if 'python' not in data['name']:
                raise serializers.ValidationError('name error')
            return data


class ClassesSerializer(serializers.ModelSerializer):
    student_set = StudentSerializer(many=True)  # 反向查询，用student+set命名 自动将student模型类传入序列化

    class Meta:
        model = Classes
        fields = '__all__'

        # 对象级别的额外验证，该方法适合多个数据校验
        def validate_name(self, value):
            if '码趣教育' not in value:
                raise serializers.ValidationError('班级名必须含玛趣教育')
            return value
